package com.hao.main;

import android.content.Context;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Bundle;
import android.util.Log;

import com.google.android.gms.maps.LocationSource;

public class GpsListener implements LocationListener, LocationSource {

	/** Hằng số dùng để format tọa độ về dạng 6 chữ số thập phân */
	public static final double ROUND_LENGTH = 1000000.0;
	/** Sai số cho phép theo đơn vị met */
	public static final float MAX_ACURACY = 200;
	
	public static final int PRIOR_GPS_TIME = 60 * 1000;

	/**
	 * Cờ xác định đã bật gps chưa
	 */
	private boolean isGpsEnable = false;

	/** Tham chiếu tới main */
	private MainActivity main;
	/** Quản lý dịch vụ vị trí */
	private LocationManager locationManager;
	/** Đối tượng để gửi tín hiệu đến map */
	private OnLocationChangedListener listener;
	/** Đối tượng update thông tin vị trí từ network*/
	private NetListener netListener;
	
	private long lastGpsTime = System.currentTimeMillis();

	/**
	 * Khởi tạo class lắng nghe vị trí dựa vào ăng ten gps
	 */
	public GpsListener(MainActivity context) {
		Log.e("GpsListener","START");
		main = context;
		netListener = new NetListener();
		locationManager = (LocationManager) main.getSystemService(Context.LOCATION_SERVICE);
		isGpsEnable = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
		locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);
		locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, netListener);
		
		if (locationManager != null) {
			Location location = locationManager
					.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
			if (location != null) {
				Log.e("GpsListener","FIRST GET");
				main.updateLocation(location); 
			}
		}
			
	}

	@Override
	public void onLocationChanged(Location location) {
      	Log.e("GpsListener","GPS==========================================");
		if (location != null) {
			main.updateLocation(location); 
			// Cập nhật dữ liệu vị trí cho map
			if (listener != null) {
				listener.onLocationChanged(location);
			}
			if (!isGpsEnable) {
				isGpsEnable = true;
			}
			
			lastGpsTime = System.currentTimeMillis();
		} 
	}

	@Override
	public void onProviderDisabled(String provider) {
		if (provider != null && provider.equalsIgnoreCase(LocationManager.GPS_PROVIDER)) {
			isGpsEnable = false;
			locationManager.removeUpdates(this);
		}
	}

	@Override
	public void onProviderEnabled(String provider) {
		if (provider != null && provider.equalsIgnoreCase(LocationManager.GPS_PROVIDER)) {
			isGpsEnable = true;
			locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);
		}
	}

	@Override
	public void onStatusChanged(String provider, int status, Bundle extras) {

	}

	/**
	 * Yêu cầu update lại dịch vụ vị trí
	 */
	public void requestUpdate() {
		if (locationManager == null) {
			locationManager = (LocationManager) main.getSystemService(Context.LOCATION_SERVICE);
		}
		locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 1000, 0, this);
		if(netListener == null){
			netListener = new NetListener();
		}
		locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0, netListener);
	}

	/**
	 * Yêu cầu dừng dịch vụ vị trí
	 */
	public void requestStopUpdate() {
//		Log.e("Binhanh", "requestStopUpdate");
		if (locationManager != null) {
			locationManager.removeUpdates(this);
			if (netListener != null)
				locationManager.removeUpdates(netListener);
		}
	}

	public boolean isGpsEnable() {
		if (locationManager != null) {
			isGpsEnable = locationManager.isProviderEnabled(LocationManager.GPS_PROVIDER);
		} else {
			isGpsEnable = false;
		}
		return isGpsEnable;
	}
	
	/**
	 * Kiểm tra xem có sử dụng mạng wifi để lấy vị trí hay không
	 * @return
	 */
	public boolean isNetGpsEnable() {
		boolean isNetGpsEnable = false;
		if (locationManager != null) {
			isNetGpsEnable = locationManager.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
		}
		return isNetGpsEnable;
	}
	
	/**
	 * Kiểm tra gps có được enable hay không.
	 * @return
	 */
	public boolean isLocationEnable() {
		return isGpsEnable() || isNetGpsEnable();
	}
	

	@Override
	public void activate(OnLocationChangedListener _listener) {
		this.listener = _listener;

	}

	@Override
	public void deactivate() {

	}
	/**
	 * InerClass to listen network location
	 */
	private class NetListener implements LocationListener {
		@Override
		public void onLocationChanged(Location location) {
//			Log.e("NetListener","onLocationChanged*********************************************");
			if (location != null){
				
				//Nếu gps disble thì sử dụng mạng
				boolean isUsed = !isGpsEnable();
				
				//nếu gps enable và tín hiệu gps mất hơn 1 phút thì sử dụng mạng
				if(!isUsed 
						&& ((System.currentTimeMillis() - lastGpsTime) > PRIOR_GPS_TIME)){
					isUsed = true;
				}
				
				//Nếu được ưu tiên thì lấy vị trí từ mạng
				if(isUsed){
					// Cập nhật dữ liệu vị trí cho map
					if (listener != null) {
						listener.onLocationChanged(location);
					}
					main.updateLocation(location); 
				}
			}
					
		}

		@Override
		public void onProviderDisabled(String provider) {
			
		}

		@Override
		public void onProviderEnabled(String provider) {
			
		}
		@Override
		public void onStatusChanged(String provider, int status, Bundle extras) {

		}
	}
}
